<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 继承 
        // 让一个子类(构造函数)  去 继承 父类 (构造函数) 的 属性和方法 (原型对象  实例化对象)  
        // 改写父类的方法  (方法重载)
        // 新增一些方法和属性  (多态)

        // 继承的目的是为了实现 代码复用 高度融合  


        function Person(name,age){
            this.name = name;
            this.age = age 
        }

        Person.prototype.type = "Human";
        Person.prototype.skill = function(){
            console.log("语言交流 -   思想思考")
        }
        Person.prototype.say = function(){
            console.log(this.name,this.age)
        }

        var p = new Person("zkl","28");
        console.log(p)

        // console.log(p.__proto__.constructor === Person)

        // 继承  
        // 2. 原型继承  (constructor + prototype )
        // 最简单的 原型继承  (浅拷贝   Student 和 Person  他们的prototype 共用一个内存空间地址)

        // Student 的原型链
        // 以前  stu ->  Student.prototype -> Object.prototype -> null 
        // 现在  stu ->  Student.prototype(Person.prototype) -> Object.prototype -> null 


        function Student(name,age,grade){
            this.grade = grade;
        }
        // Student.prototype = Person.prototype;   // 浅拷贝
      

        // 中间件继承 
        // function Fn(){}
        // Fn.prototype = Person.prototype;
        // Student.prototype = new Fn(); // 实例化对象   当前对象的实例对象 prototype 
        // Student.prototype.constructor = Student;


        // Student.prototype = new Person();   // 直接继承父类原型 

        // 对象复制  得到父类所有的原型对象 
        for(var key in Person.prototype){
            Student.prototype[key] = Person.prototype[key]
        }

        Student.prototype.speak = function(){
            console.log("我的成绩是 :"+this.name + ' - ' + this.grade)
        }
        // console.log(Student)

        var stu = new Student("小虎",20,99);
        console.log(stu)
        console.log(stu.name)
        stu.speak()
        stu.say();
        stu.skill()


    </script>
</body>
</html>